﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

using PMServiceDesk.Utils.ManejoDatos;
using PMServiceDesk.Parameters.Constantes;

namespace PMServiceDesk.DataAccess
{
    public static class SoporteData
    {
        public static List<KeyValuePair<string, string>> ProyectosPorUsuario(string usuario)
        {
            string sql = @"SELECT 
                            PROY.ID									    [PROYECTOID]
                           ,PROY.NOMBRE + ' [' + ESTPROY.NOMBRE + ']'	[PROYECTO]
                            FROM USUARIO US
                            INNER JOIN USUARIORECURSO UR ON US.ID = UR.USUARIOID
                            INNER JOIN RECURSO REC ON UR.RECURSOID = REC.ID
                            INNER JOIN PROYECTO PROY ON REC.PROYECTOID = PROY.ID
                            INNER JOIN ESTADO ESTPROY ON PROY.ESTADOID=ESTPROY.ID
                            WHERE US.ID=@USUARIOID
                            ORDER BY ESTPROY.ORDEN,PROY.NOMBRE";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@USUARIOID", usuario);

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> ParametrosPorDominio(string dominioId, string habilitado = null)
        {
            string sql = @"SELECT 
                            PAR.ID
                            ,PAR.NOMBRE
                            FROM PARAMETRO [PAR]
                            WHERE PAR.DOMINIOID=@DOMINIOID
                            ";

            if (habilitado != null) sql += "AND HABILITADO = @HABILITADO";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@DOMINIOID", dominioId);
            parametros.Add("@HABILITADO", (habilitado == "1"));

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> ParametrosAbreviaturaPorDominio(string dominioId, string habilitado = null)
        {
            string sql = @"SELECT 
                            PAR.ID
                            ,PAR.ABREVIATURA
                            FROM PARAMETRO [PAR]
                            WHERE PAR.DOMINIOID=@DOMINIOID
                            ";

            if (habilitado != null) sql += "AND HABILITADO = @HABILITADO";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@DOMINIOID", dominioId);
            parametros.Add("@HABILITADO", (habilitado == "1"));

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> EstadosPorTabla(string tablaId, string habilitado = null)
        {
            string sql = @"SELECT 
                            EST.ID
                            ,EST.NOMBRE
                            FROM ESTADO [EST]
                            WHERE EST.TABLAID=@TABLAID
                            ";

            if (habilitado != null) sql += "AND HABILITADO = @HABILITADO";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@TABLAID", tablaId);
            parametros.Add("@HABILITADO", (habilitado == "1"));

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> JefesProyecto(string rol,string estadoRecursoId,bool rolHabilitado)
        {
            string sql = @"SELECT 
                            DISTINCT
                            US.ID						                                                [ID]
                           ,TIPDOC.ABREVIATURA + ':' + REC.DOCUMENTOIDENTIDAD + ' - ' + REC.NOMBRE		[USUARIO]
                            FROM USUARIO US
                            INNER JOIN USUARIORECURSO UR ON US.ID = UR.USUARIOID
                            INNER JOIN RECURSO REC ON UR.RECURSOID = REC.ID
                            INNER JOIN PROYECTO PROY ON REC.PROYECTOID = PROY.ID
                            INNER JOIN PARAMETRO TIPDOC ON REC.TIPODOCUMENTOIDENTIDADID=TIPDOC.ID
                            WHERE UR.ROLID IN (SELECT RL.ID FROM ROL RL WHERE RL.NOMBRE=@ROL AND RL.HABILITADO=@ROLHABILITADO)
                            AND REC.ESTADOID=@ESTADORECURSOID
                            ";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@ROL", rol);
            parametros.Add("@ROLHABILITADO", rolHabilitado);
            parametros.Add("@ESTADORECURSOID", estadoRecursoId);

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> JefesProyectoPorProyecto(string proyectoId,string rol, string estadoRecursoId, bool rolHabilitado)
        {
            string sql = @"SELECT 
                            US.ID						                                                [ID]
                           ,TIPDOC.ABREVIATURA + ':' + REC.DOCUMENTOIDENTIDAD + ' - ' + REC.NOMBRE      [JEFEPROYECTO]
                            FROM USUARIO US
                            INNER JOIN USUARIORECURSO UR ON US.ID = UR.USUARIOID
                            INNER JOIN RECURSO REC ON UR.RECURSOID = REC.ID
                            INNER JOIN PROYECTO PROY ON REC.PROYECTOID = PROY.ID
                            INNER JOIN PARAMETRO TIPDOC ON REC.TIPODOCUMENTOIDENTIDADID=TIPDOC.ID
                            WHERE REC.PROYECTOID=@PROYECTOID
                            AND UR.ROLID IN (SELECT RL.ID FROM ROL RL WHERE RL.NOMBRE=@ROL AND RL.HABILITADO=@ROLHABILITADO)
                            AND REC.ESTADOID=@ESTADORECURSOID
                            ";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@PROYECTOID", proyectoId);
            parametros.Add("@ROL", rol);
            parametros.Add("@ROLHABILITADO", rolHabilitado);
            parametros.Add("@ESTADORECURSOID", estadoRecursoId);

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> UsuariosPorProyecto(string proyectoId, string estadoRecursoId, bool rolHabilitado)
        {
            string sql = @"SELECT 
                            US.ID						[ID]
                           ,REC.NOMBRE                  [USUARIO]
                            FROM USUARIO US
                            INNER JOIN USUARIORECURSO [UR] ON US.ID = UR.USUARIOID
                            INNER JOIN RECURSO [REC] ON UR.RECURSOID = REC.ID
                            INNER JOIN ROL  [ROL] ON ROL.ID=UR.ROLID
                            WHERE REC.PROYECTOID=@PROYECTOID
                            AND REC.ESTADOID=@ESTADORECURSOID
                            AND ROL.HABILITADO=@ROLHABILITADO
                            ";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@PROYECTOID", proyectoId);
            parametros.Add("@ESTADORECURSOID", estadoRecursoId);
            parametros.Add("@ROLHABILITADO", rolHabilitado);


            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> TiposPaqueteTrabajo(string proyectoId, string habilitado = null)
        {
            string sql = @"SELECT 
                            ID
                            ,NOMBRE
                            FROM TIPOPAQUETETRABAJO
                            WHERE PROYECTOID = @PROYECTOID
                            ";

            if (habilitado != null) sql += "AND HABILITADO = @HABILITADO";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@PROYECTOID", proyectoId);
            parametros.Add("@HABILITADO", (habilitado=="1"));

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> EstadosPaqueteTrabajo(string tipoPaqueteTrabajoId, string habilitado = null)
        {
            string sql = @"SELECT 
                            ID
                            ,NOMBRE
                            FROM ESTADOPAQUETETRABAJO
                            WHERE TIPOPAQUETETRABAJOID = @TIPOPAQUETETRABAJOID
                            ";

            if (habilitado != null) sql += "AND HABILITADO = @HABILITADO";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@TIPOPAQUETETRABAJOID", tipoPaqueteTrabajoId);
            parametros.Add("@HABILITADO", (habilitado == "1"));

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> EstadosPaqueteTrabajoPorProyecto(string proyectoId)
        {
            string sql = @"SELECT 
                            EST.ID
                            ,TIP.NOMBRE + ' - ' + EST.NOMBRE
                            FROM ESTADOPAQUETETRABAJO [EST]
                            INNER JOIN TIPOPAQUETETRABAJO [TIP] ON TIP.ID=EST.TIPOPAQUETETRABAJOID
                            WHERE TIP.PROYECTOID = @PROYECTOID
                            AND TIP.HABILITADO = 1
                            ";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@PROYECTOID", proyectoId);

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> RecursosPorProyecto(string proyectoId)
        {
            string sql = @"SELECT ID,'[' + ABREVIATURA + '] ' + NOMBRE FROM RECURSO
                            WHERE PROYECTOID=@PROYECTOID
                            AND ESTADOID=@ESTADOID
                            ";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@PROYECTOID", proyectoId);
            parametros.Add("@ESTADOID", Estados.Recurso_Vigente);

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> TransicionEstados(string rolId, string estadoPaqueteTrabajoId,string permiso,bool habilitado)
        {
            string sql = @"SELECT TABLA.ID,TABLA.NOMBRE FROM
                            (
	                            SELECT 
	                            EST.ID
	                            ,EST.NOMBRE 
	                            ,EST.ORDEN
	                            FROM PERMISOROLPAQUETETRABAJO [PERPAQ]
	                            INNER JOIN TRANSICIONESTADO [TRAEST] ON TRAEST.PERMISOROLID = PERPAQ.ID
	                            INNER JOIN ESTADOPAQUETETRABAJO [EST] ON EST.ID = TRAEST.ESTADODESTINOID
	                            WHERE PERPAQ.ROLID=@ROLID
	                            AND PERPAQ.ESTADOPAQUETETRABAJOID=@ESTADOPAQUETETRABAJOID
	                            AND PERPAQ.PERMISO=@PERMISO
	                            AND TRAEST.HABILITADO=@HABILITADO   
                            ) TABLA ORDER BY  TABLA.ORDEN
                            ";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@ROLID", rolId);
            parametros.Add("@ESTADOPAQUETETRABAJOID", estadoPaqueteTrabajoId);
            parametros.Add("@PERMISO", permiso);
            parametros.Add("@HABILITADO", habilitado);

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static List<KeyValuePair<string, string>> TransicionUsuarios(string usuarioAsignadoId,string estadoPaqueteTrabajoId, string permiso, bool habilitado)
        {
            string sql = @"DECLARE @PROYECTOID INTEGER;

                           SET @PROYECTOID = 0;                        
    
                           IF @USUARIOASIGNADOID > 0 
                           BEGIN
                               SET @PROYECTOID = (
                                                    SELECT 
                                                    TIP.PROYECTOID 
                                                    FROM ESTADOPAQUETETRABAJO EST
                                                    INNER JOIN TIPOPAQUETETRABAJO TIP ON TIP.ID = EST.TIPOPAQUETETRABAJOID
                                                    WHERE EST.ID=@ESTADOPAQUETETRABAJOID
                                                 );
                           END;


                            SELECT
                            TABLA.*
                            FROM
                            (
	                            SELECT 
	                            USUREC.USUARIOID
	                            ,REC.NOMBRE
	                            FROM USUARIORECURSO [USUREC]
	                            INNER JOIN RECURSO [REC] ON REC.ID = USUREC.RECURSOID 
	                            WHERE USUREC.USUARIOID=@USUARIOASIGNADOID
                                AND REC.PROYECTOID=@PROYECTOID

	                            UNION

	                            SELECT 
	                            USUREC.USUARIOID
	                            ,REC.NOMBRE
	                            FROM USUARIORECURSO [USUREC]
	                            INNER JOIN RECURSO [REC] ON REC.ID = USUREC.RECURSOID AND REC.ESTADOID = 7
	                            WHERE USUREC.ROLID 
	                            IN
	                            (
		                            SELECT 
                                    DISTINCT ROL.ID 
                                    FROM PERMISOROLPAQUETETRABAJO [PERPAQ]
		                            INNER JOIN [ROL] ON ROL.ID = PERPAQ.ROLID
		                            WHERE PERPAQ.ESTADOPAQUETETRABAJOID = @ESTADOPAQUETETRABAJOID
		                            AND PERPAQ.PERMISO=@PERMISO
		                            AND ROL.HABILITADO=@HABILITADO
	                            )
                            ) TABLA
                            ORDER BY TABLA.NOMBRE
                            ";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@USUARIOASIGNADOID", ConvertFormat.Char_To_Integer(usuarioAsignadoId));
            parametros.Add("@ESTADOPAQUETETRABAJOID", estadoPaqueteTrabajoId);
            parametros.Add("@PERMISO", permiso);
            parametros.Add("@HABILITADO", habilitado);

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static string PermisoPorPaqueteTrabajo(string usuarioId, string paqueteTrabajoId)
        {
            string sql = @"BEGIN
	                            DECLARE @PERMISO INTEGER,@ESTADOPAQUETETRABAJOID INTEGER,@PROYECTOID INTEGER,@ROLID INTEGER;
	
	                            SET @PERMISO = 0;
	
	                            IF
	                            (
		                            EXISTS 
		                            (
			                            SELECT 1 FROM INTERESADOPAQUETETRABAJO 
			                            WHERE PAQUETETRABAJOID=@PAQUETETRABAJOID 
			                            AND USUARIOINTERESADOID=@USUARIOID
		                            )
	                            )
	                            BEGIN
		                            SET @PERMISO  = 1;
	                            END;
	
	                            IF(@PERMISO >  0)
	                            BEGIN
		                            SELECT 
		                            @ESTADOPAQUETETRABAJOID=PAQ.ESTADOPAQUETETRABAJOID
		                            ,@PROYECTOID=PROYECTOID
		                            FROM PAQUETETRABAJO [PAQ] 
		                            WHERE PAQ.ID=@PAQUETETRABAJOID;
		
		                            SET @ROLID = (
						                            SELECT 
						                            USUREC.ROLID
						                            FROM USUARIORECURSO [USUREC] 
						                            INNER JOIN RECURSO [REC] ON REC.ID=USUREC.RECURSOID
						                            WHERE USUREC.USUARIOID=@USUARIOID 
                                                    AND REC.PROYECTOID=@PROYECTOID
					                              );
					  		
		                            SET @PERMISO = (
							                            SELECT PERPAQ.PERMISO FROM PERMISOROLPAQUETETRABAJO [PERPAQ]
							                            WHERE PERPAQ.ROLID=@ROLID
							                            AND PERPAQ.ESTADOPAQUETETRABAJOID = @ESTADOPAQUETETRABAJOID
						                            );
	                            END;
	
	                            SELECT @PERMISO;
                            END;
                            ";

            using (DataUtil data = new DataUtil(TypeDataBase.PMServiceDesk,CommandType.Text,sql))
            {
                data.AddParameter("@USUARIOID", ConvertFormat.Char_To_Integer(usuarioId));
                data.AddParameter("@PAQUETETRABAJOID", ConvertFormat.Char_To_Integer(paqueteTrabajoId));

                return data.ExecuteScalar().ToString();
            }
        }

        public static decimal PorcentajeAvancePaqueteTrabajo(string paqueteTrabajoId)
        {
            string sql = @"BEGIN
	                            DECLARE @PORCENTAJEAVANCE DECIMAL(10,2);
	
	                            SET @PORCENTAJEAVANCE = (
                                                            SELECT 
                                                            SUM(AC.PORCENTAJEAVANCE*AC.PORCENTAJEPESO/100) 
                                                            FROM ACTIVIDAD [AC]
                                                            WHERE AC.PAQUETETRABAJOID=@PAQUETETRABAJOID
                                                        );

                                UPDATE PAQUETETRABAJO SET
                                PORCENTAJEAVANCE = @PORCENTAJEAVANCE
                                WHERE ID=@PAQUETETRABAJOID;
                                
                                SELECT @PORCENTAJEAVANCE;
                            END;
                            ";

            using (DataUtil data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql))
            {
                data.AddParameter("@PAQUETETRABAJOID", ConvertFormat.Char_To_Integer(paqueteTrabajoId));

                return ConvertFormat.Char_To_Decimal(data.ExecuteScalar(true));
            }
        }

        public static int RegistrarTransicionDocumentos(string documentoTransicionEstadoId,string documentoPaqueteTrabajoId)
        {
            string sql = @"BEGIN
	                            DECLARE @ID INTEGER;
	
	                            SET @ID = (
                                            SELECT ID               
                                            FROM DOCUMENTOTRANSICIONPAQUETETRABAJO 
                                            WHERE DOCUMENTOTRANSICIONESTADOID=@DOCUMENTOTRANSICIONESTADOID
                                        );

                                IF @ID IS NULL
                                BEGIN
                                    INSERT INTO DOCUMENTOTRANSICIONPAQUETETRABAJO 
                                    VALUES(@DOCUMENTOTRANSICIONESTADOID,@DOCUMENTOPAQUETETRABAJOID)
                                END
                                ELSE
                                BEGIN
                                    UPDATE DOCUMENTOTRANSICIONPAQUETETRABAJO SET
                                    DOCUMENTOPAQUETETRABAJOID = @DOCUMENTOPAQUETETRABAJOID
                                    WHERE DOCUMENTOTRANSICIONESTADOID=@DOCUMENTOTRANSICIONESTADOID;
                                END;
                            END;
                            ";

            using (DataUtil data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql))
            {
                data.AddParameter("@DOCUMENTOTRANSICIONESTADOID", documentoTransicionEstadoId);
                data.AddParameter("@DOCUMENTOPAQUETETRABAJOID", documentoPaqueteTrabajoId);

                return data.ExecuteNonQuery();
            }
        }

        public static List<KeyValuePair<string, string>> CalendariosPorProyecto(string proyectoId, string habilitado = null)
        {
            string sql = @"SELECT 
                                    ID
                                    ,NOMBRE
                                    FROM CALENDARIO
                                    WHERE PROYECTOID=@PROYECTOID
                            ";

            if (habilitado != null) sql += "AND HABILITADO = @HABILITADO";

            Dictionary<string, object> parametros = new Dictionary<string, object>();
            parametros.Add("@PROYECTOID", proyectoId);
            parametros.Add("@HABILITADO", (habilitado == "1"));

            return DataReader.ReturnDictionaryReader(TypeDataBase.PMServiceDesk, sql, parametros);
        }

        public static decimal CalcularCPIoSPI(decimal numerador,decimal denominador)
        {
            if (numerador <= 0 || denominador <= 0) return 1;

            return Math.Round(numerador / denominador,2);
        }

        public static decimal CalcularCPI(decimal ev,decimal ac)
        {
            if (ev == 0 && ac == 0) return 1;

            if (ev == 0) ev = Convert.ToDecimal(0.1);

            if (ac == 0) ac = 1;

            return ev / ac;
        }

        public static decimal CalcularSPI(decimal ev, decimal pv)
        {
            if (ev == 0 && pv == 0) return 1;

            if (ev == 0) ev = Convert.ToDecimal(0.1);

            if (pv == 0) pv = 1;

            return ev / pv;
        }
    }
}
